package com.feige.jwt;

import com.feige.constant.Constants;
import com.feige.utils.string.StringUtils;
import org.joda.time.DateTime;
import org.joda.time.DateTimeUtils;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Date;
import java.util.Map;

/**
 * @author feige
 */
public interface TokenHelper {

    /**
     * 获取真实token，去除前缀
     * @param jwtToken token
     * @return
     */
    default String getRealToken(String jwtToken){
        if (StringUtils.isNotBlank(jwtToken) && jwtToken.startsWith(Constants.TOKEN_PREFIX)) {
            jwtToken = jwtToken.substring(Constants.TOKEN_PREFIX.length());
        }
        return jwtToken;
    }

    /**
     * 获取真实token，去除前缀
     * @param request 请求
     * @return
     */
    default String getRealToken(HttpServletRequest request){
        String jwtToken = request.getHeader(Constants.TOKEN_KEY);
        return getRealToken(jwtToken);
    }
    
    /**
     * 生成token
     * @param claims 业务相关信息
     * @return
     */
    String generateToken(Map<String, Object> claims);


    /**
     * 刷新token
     * @param request 请求
     * @param response 响应
     * @return
     */
    void refreshToken(HttpServletRequest request, HttpServletResponse response);
    
    /**
     * 解析token，获取业务相关信息
     * @param token token
     * @return
     */
    Map<String, Object> getClaims(String token);

    /**
     * 解析token，获取业务相关信息
     * @param request 请求
     * @return
     */
    default Map<String, Object> getClaims(HttpServletRequest request){
        String token = getRealToken(request);
        return getClaims(token);
    }

    /**
     * 校验token是否过期
     * @param token
     * @return
     */
    boolean isExpired(String token);

    /**
     * 校验token是否过期
     * @param request
     * @return
     */
    default boolean isExpired(HttpServletRequest request){
        String token = getRealToken(request);
        return isExpired(token);
    }
}
